package com.itheima.reggie.web;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.service.IEmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;

import java.time.LocalDateTime;

/**
 * 表现层
 */
@Slf4j
@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    IEmployeeService employeeService;

    @PostMapping("/login")
    public R checkLogin(@RequestBody Employee employee, HttpSession session) {
        log.info("登录校验，用户信息：{}", employee);
/**
 * 1、获取用户名+密码 ：User对象接收数据
 * 2、根据用户名查询用户信息：
 * select * from user where username=?
 *  判断：查询不到，返回登录失败
 * 3、如果查询到了，比对密码是否正确【用户输入的密码加密后和 数据库的密码进行比对】
 *  判断： 比对失败，返回登录失败
 * 4、比对成功，说明用户名和密码是对的。
 *判断：用户是否禁用【status：0禁用  1正常】，
 * 如果是禁用，返回登录失败【员工已禁用】
 * 5、用户状态正常。登录成功。
 * 5.1、存用户信息【只存用户的id】到session。
 * 5.2、返回响应结果
 */
        LambdaUpdateWrapper<Employee> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(Employee::getUsername, employee.getUsername());

        Employee queryEmp = employeeService.getOne(wrapper);
        //2.1 判断：查询不到，返回登陆失败
        if (queryEmp == null) {
            return R.error("用户名不存在，登陆失败");
        }
        //3.3、如果查询到了，比对密码是否正确
        // 【用户输入的密码加密后和 数据库的密码进行比对】
        String pwd = DigestUtils.md5DigestAsHex(employee.getPassword().getBytes());
        // 判断： 比对失败，返回登录失败
        if (!pwd.equals(queryEmp.getPassword())) {
            return R.error("密码错误，登陆失败");
        }
        //4.比对成功，说明用户名和密码是对的
        //4.1判断用户状态
        if (queryEmp.getStatus() == 0) {
            return R.error("登录失败，员工已被禁用");
        }
        //5.存用户信息【只存用户的id】到session。
        session.setAttribute("emp", queryEmp.getId());

        return R.success(queryEmp);
    }

    /**
     * 员工退出
     */

    @PostMapping("/logout")
    public R<String> logout(HttpSession session) {
        session.removeAttribute("emp");
        return R.success("退出成功");
    }

    @PostMapping
    public R addEmp(@RequestBody Employee employee, HttpSession session) {

        // employee.setCreateTime(LocalDateTime.now());
        // employee.setUpdateTime(LocalDateTime.now());
        // employee.setCreateUser((Long) session.getAttribute("emp"));
        // employee.setUpdateUser((Long) session.getAttribute("emp"));

        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));

        log.info("employee:{}", employee);
        employeeService.save(employee);
        return R.success(null);
    }

    /**
     * 分页查询
     */
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name) {
        //1.构造分页构造器
        Page pageInfo = new Page(page, pageSize);
        //2.构造条件构造器
        LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();
        //添加过滤条件
        queryWrapper.like(!StringUtils.isEmpty(name), Employee::getName, name);
        //添加排序条件
        queryWrapper.orderByDesc(Employee::getUpdateTime);

        //3.执行查询
        employeeService.page(pageInfo, queryWrapper);


        return R.success(pageInfo);
    }

    /**
     * 修改员工信息
     */
    @PutMapping
    public R<String> update(@RequestBody Employee employee, HttpSession session) {
        //数据表要求非空的更新人与更新时间
      //  employee.setUpdateTime(LocalDateTime.now());
     //   employee.setUpdateUser((Long) session.getAttribute("emp"));

        //更新操作
        employeeService.updateById(employee);

        return R.success("员工信息修改成功");
    }

    /**
     * 先根据id查询员工信息
     */
    @GetMapping("/{id}")
    public R<Employee> getById(@PathVariable Long id) {
        log.info("根据id查询员工信息");
        Employee employee = employeeService.getById(id);
        if (employee != null) {
            return R.success(employee);
        }
        return R.error("没有查询到对应员工");
    }

}
